package br.com.dataphonebr.dao.impl;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Date;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import br.com.dataphonebr.entity.ContasAPagar;
import br.com.dataphonebr.entity.ContasAReceber;
import br.com.dataphonebr.entity.Grupo;
import br.com.dataphonebr.entity.LancamentoFinanceiro;
import br.com.dataphonebr.entity.Usuario;
import br.com.dataphonebr.enumerator.FormaPagamento;
import br.com.dataphonebr.enumerator.TipoLancamentoFinanceiro;
 
public class LancamentoFinanceiroDao extends GenericDaoImpl<LancamentoFinanceiro> {
	
	private GrupoDao grupoDao;
	private UsuarioDao usuarioDao;
	
	public enum EField{
		
		CODIGO ("codigo"),
		CODIGO_GRUPO ("codigo_grupo"),
		CODIGO_USUARIO ("codigo_usuario"),
		TITULO ("titulo"),
		DESCRICAO ("descricao"),
		DATA_EMISSAO ("data_emissao"),
		PUBLICO ("publico"),
		TIPO_LANCAMENTO ("tipo"),
		FORMA_PAGAMENTO("forma_pagamento"),
		LANCAMENTO_PADRAO ("lancamento_padrao"),
		VALOR ("valor"),
		CODIGO_CONTA_A_PAGAR ("codigo_conta_pagar"),
		CODIGO_CONTA_A_RECEBER ("codigo_conta_receber"),
		DATA_CADASTRO ("data_cadastro"),
		DATA_ATUALIZACAO ("data_atualizacao"),
		USUARIO_CADASTRO ("usuario_cadastro"),
		USUARIO_ATUALIZACAO ("usuario_atualizacao");
		
		private String name;
		
		private EField(String name) {
			this.name = name;
		}
		
		public String getName() {
			return name;
		}
		
	
	}
	
	public LancamentoFinanceiroDao(Context context) {
		super(context);
		grupoDao = new GrupoDao(context);
		usuarioDao = new UsuarioDao(context);
	}
	
	@Override
	public String getTableName() {
		return "LANCAMENTO_FINANCEIRO";
	}

	@Override
	public String getColumnHack() {
		return EField.CODIGO.getName();
	}

	@Override
	public ContentValues getContentValues(LancamentoFinanceiro entity) {
		ContentValues grupoValues = new ContentValues();
		grupoValues.put(EField.CODIGO.getName(), entity.getCodigo());
		grupoValues.put(EField.CODIGO_GRUPO.getName(), entity.getGrupo().getCodigo());
		grupoValues.put(EField.CODIGO_USUARIO.getName(), entity.getUsuario().getCodigo());
		grupoValues.put(EField.TITULO.getName(), entity.getTitulo());
		grupoValues.put(EField.DESCRICAO.getName(), entity.getDescricao());
		grupoValues.put(EField.DATA_EMISSAO.getName(), entity.getDataEmissao().getTime());
		grupoValues.put(EField.PUBLICO.getName(), entity.getPublico());
		grupoValues.put(EField.TIPO_LANCAMENTO.getName(), entity.getTipo().ordinal());
		grupoValues.put(EField.FORMA_PAGAMENTO.getName(), entity.getFormaPagamento().ordinal());
		grupoValues.put(EField.LANCAMENTO_PADRAO.getName(), entity.getLancamentoPadrao());
		grupoValues.put(EField.VALOR.getName(), entity.getValor().doubleValue());
		grupoValues.put(EField.CODIGO_CONTA_A_PAGAR.getName(), entity.getContaAPagar() != null && entity.getContaAPagar().getCodigo()!=null?entity.getContaAPagar().getCodigo():null);
		grupoValues.put(EField.CODIGO_CONTA_A_RECEBER.getName(), entity.getContaAReceber() != null && entity.getContaAReceber().getCodigo()!=null?entity.getContaAReceber().getCodigo():null);
		grupoValues.put(EField.DATA_CADASTRO.getName(), entity.getDataCadastro().getTime());
		grupoValues.put(EField.DATA_ATUALIZACAO.getName(), entity.getDataAtualizacao()!=null?entity.getDataAtualizacao().getTime():null);
		grupoValues.put(EField.USUARIO_CADASTRO.getName(), entity.getUsuarioCadastro());
		grupoValues.put(EField.USUARIO_ATUALIZACAO.getName(), entity.getUsuarioAtualizacao());
		return grupoValues;
	}

	@Override
	protected String getScriptCreateTable() {
		StringBuffer query = new StringBuffer();
		query.append(" CREATE TABLE ");
		query.append(getTableName());
		query.append(" ( ");
		query.append(EField.CODIGO.name).append(" INTEGER PRIMARY KEY AUTOINCREMENT,");
		query.append(EField.CODIGO_GRUPO.name).append(" INTEGER not null,");
		query.append(EField.CODIGO_USUARIO.name).append(" INTEGER,");
		query.append(EField.TITULO.name).append(" TEXT not null,");
		query.append(EField.DESCRICAO.name).append(" TEXT,");
		query.append(EField.DATA_EMISSAO.name).append(" DATE,");
		query.append(EField.PUBLICO.name).append(" BOOLEAN not null default false,");
		query.append(EField.TIPO_LANCAMENTO.name).append(" INTEGER, ");
		query.append(EField.FORMA_PAGAMENTO.name).append(" INTEGER, ");
		query.append(EField.LANCAMENTO_PADRAO.name).append(" BOOLEAN not null default false,");
		query.append(EField.VALOR.name).append(" DOUBLE not null default 0, ");
		query.append(EField.CODIGO_CONTA_A_PAGAR.name).append(" INTEGER,");
		query.append(EField.CODIGO_CONTA_A_RECEBER.name).append(" INTEGER,");
		query.append(EField.DATA_CADASTRO.name).append(" DATE,");
		query.append(EField.DATA_ATUALIZACAO.name).append(" DATE,");
		query.append(EField.USUARIO_CADASTRO.name).append(" TEXT,");
		query.append(EField.USUARIO_ATUALIZACAO.name).append(" TEXT");
		query.append(" ); ");
		return query.toString();
	}

	@Override
	protected String getScriptForeignKey() {
		StringBuffer fkScript = new StringBuffer();
		fkScript.append(createForeignKey(EField.CODIGO_GRUPO.name, "CODIGO", "GRUPO"));
		fkScript.append(createForeignKey(EField.CODIGO_USUARIO.name, "CODIGO", "USUARIO"));
		fkScript.append(createForeignKey(EField.CODIGO_CONTA_A_PAGAR.name, "CODIGO", "CONTAS_PAGAR"));
		fkScript.append(createForeignKey(EField.CODIGO_CONTA_A_RECEBER.name, "CODIGO", "CONTAS_RECEBER"));
		return fkScript.toString();
	}

	@Override
	protected String getScriptCreateIndex() {
		StringBuffer query = new StringBuffer();
		query.append(createIndex(EField.TITULO.name, false));
		query.append(createIndex(EField.PUBLICO.name, false));
		query.append(createIndex(EField.TIPO_LANCAMENTO.name, false));
		query.append(createIndex(EField.DATA_EMISSAO.name, false));
		query.append(createIndex(EField.LANCAMENTO_PADRAO.name, false));
		return query.toString();
	}

	@Override
	protected LancamentoFinanceiro cursorToEntity(Cursor cursor) {
		Long codigo = cursor.getLong(EField.CODIGO.ordinal());
		Grupo grupo = grupoDao.selectById(cursor.getLong(EField.CODIGO_GRUPO.ordinal()));
		Usuario usuario = usuarioDao.selectById(cursor.getLong(EField.CODIGO_USUARIO.ordinal()));
		ContasAPagar contaAPagar = null;//grupoDao.selectById(cursor.getLong(EField.CODIGO_GRUPO.ordinal()));
		ContasAReceber contaAReceber = null;//grupoDao.selectById(cursor.getLong(EField.CODIGO_GRUPO.ordinal()));
		String titulo = cursor.getString(EField.TITULO.ordinal());
		String descricao = cursor.getString(EField.DESCRICAO.ordinal());
		Date dataEmissao = getDateValueFromCursor(cursor.getString(EField.DATA_EMISSAO.ordinal()));
		Boolean publico = getBooleanValueFromCursor(cursor.getString(EField.PUBLICO.ordinal()));
		TipoLancamentoFinanceiro tipo = TipoLancamentoFinanceiro.getTipoByIndex(cursor.getInt(EField.TIPO_LANCAMENTO.ordinal()));
		FormaPagamento formaPagamento = FormaPagamento.getFormaPagamentoByIndex(cursor.getInt(EField.FORMA_PAGAMENTO.ordinal()));
		Boolean lancamentoPadrao = getBooleanValueFromCursor(cursor.getString(EField.LANCAMENTO_PADRAO.ordinal()));
		Double valor = cursor.getDouble(EField.VALOR.ordinal());
		Date dataCadastro = getDateValueFromCursor(cursor.getString(EField.DATA_CADASTRO.ordinal()));
		Date dataAtualizacao = getDateValueFromCursor(cursor.getString(EField.DATA_ATUALIZACAO.ordinal()));
		String usuarioCadastro = cursor.getString(EField.USUARIO_CADASTRO.ordinal());
		String usuarioAtualizacao = cursor.getString(EField.USUARIO_ATUALIZACAO.ordinal());
		BigDecimal valorLancamento = new BigDecimal(valor).setScale(2, RoundingMode.HALF_EVEN);
		return new LancamentoFinanceiro(codigo, dataCadastro, dataAtualizacao, usuarioCadastro, usuarioAtualizacao, grupo, formaPagamento, tipo, titulo, descricao, valorLancamento, dataEmissao, lancamentoPadrao, publico, usuario, contaAPagar, contaAReceber);
	}
	
	public List<LancamentoFinanceiro> selectByPublico(boolean publico){
		StringBuffer query = new StringBuffer();
		query.append(" SELECT * FROM ");
		query.append(getTableName());
		query.append(" WHERE ");
		query.append(" publico is ").append(publico);
		return getList(query.toString(), null);

	}

	public List<LancamentoFinanceiro> selectByLancamentoPadrao(boolean lancamento){
		StringBuffer query = new StringBuffer();
		query.append(" SELECT * FROM ");
		query.append(getTableName());
		query.append(" WHERE ");
		query.append(EField.LANCAMENTO_PADRAO.name).append(" is ").append(lancamento);
		return getList(query.toString(), null);
	}

	@Override
	public String getAlterTableScript() {
		// TODO Auto-generated method stub
		return null;
	}

}
